package com.cby.library.data.repository.parser

import com.google.gson.JsonDeserializer
import com.cby.library.data.model.ModuleBean
import com.google.gson.Gson
import kotlin.Throws
import com.google.gson.JsonParseException
import com.google.gson.JsonElement
import com.google.gson.JsonDeserializationContext
import com.google.gson.JsonObject
import java.lang.reflect.Type

/**
 * 首页复杂类型json
 */
abstract class ModuleJsonParser : JsonDeserializer<ModuleBean> {

    @JvmField
    protected var gson: Gson = Gson()

    @Throws(JsonParseException::class)
    override fun deserialize(
        json: JsonElement, typeOfT: Type,
        context: JsonDeserializationContext
    ): ModuleBean {
        val moduleJson = json.asJsonObject
        val moduleType = moduleJson[KEY_MODULE_TYPE].asString
        val moduleEntity = ModuleBean()
        moduleEntity.moduleType = moduleType
        moduleEntity.displayStyle = moduleJson[KEY_DISPLAY_STYLE].asString
        moduleEntity.title = moduleJson[KEY_TITLE].asString
        moduleEntity.action = moduleJson[KEY_ACTION].asString
        moduleEntity.showMore = moduleJson[KEY_SHOW_MORE].asInt
        moduleEntity.showTitle = moduleJson[KEY_SHOW_TITLE].asInt
        /**
         * * display_style : 0
         * * module_type : recommend
         * * title : 小编的眼光不会错
         * * id : 0
         * * more : 0
         */
        convertModuleJson(moduleJson, moduleEntity)
        return moduleEntity
    }

    /**
     * 根据不同类型的模块进行数据转换
     * @param moduleJson
     * @param entity
     */
    protected abstract fun convertModuleJson(moduleJson: JsonObject?, entity: ModuleBean?)

    companion object {
        private const val KEY_MODULE_TYPE = "module_type"
        private const val KEY_DISPLAY_STYLE = "display_style"
        private const val KEY_TITLE = "title"
        private const val KEY_ACTION = "action"
        private const val KEY_SHOW_MORE = "show_more"
        private const val KEY_SHOW_TITLE = "show_title"
    }

}